package v1

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"os"
	"strconv"
	"strings"
	"time"
)

// UploadImage 上传文件
func UploadImage(c *gin.Context) (filePath string, err error) {
	var (
		suffixName string
		maxSize    = int64(1024 * 1024 * 100)
		fileName   string
	)

	file, err := c.FormFile("file")
	if err != nil {
		return "", fmt.Errorf("文件解析失败")
	}

	// 判断文件名
	suffix := strings.Split(file.Filename, ".")
	if len(suffix) < 1 {
		return "", fmt.Errorf("文件名格式不正确")
	}
	suffixName = suffix[len(suffix)-1] //后缀名
	fileName = fmt.Sprintf("%s_%s.%s", suffix[0], strconv.FormatInt(time.Now().UnixNano(), 10), suffixName)
	
	// 判断大小
	if file.Size > maxSize {
		return "", fmt.Errorf("超出文件最大限制 100M")
	}

	if err = CreateFile("./file"); err != nil {
		return "", fmt.Errorf("上传失败")
	}

	//保存路径拼接当前目录下
	filePath = fmt.Sprintf("./file/%s", fileName)

	//上传文件到指定的目录
	if err = c.SaveUploadedFile(file, filePath); err != nil {
		return "", fmt.Errorf("上传失败")
	}
	return filePath, nil
}

// UploadFile 上传文件
func UploadFile(c *gin.Context) (filePath string, err error) {
	var (
		suffixName string
		maxSize    = int64(1024 * 1024 * 100)
		fileName   string
	)

	file, err := c.FormFile("file")
	if err != nil {
		return "", fmt.Errorf("文件解析失败")
	}

	// 判断文件名
	suffix := strings.Split(file.Filename, ".")
	if len(suffix) < 1 {
		return "", fmt.Errorf("文件名格式不正确")
	}
	suffixName = suffix[len(suffix)-1] //后缀名
	fileName = fmt.Sprintf("%s_%s.%s", suffix[0], strconv.FormatInt(time.Now().UnixNano(), 10), suffixName)

	// 判断文件类型 8-2日确认改为只支持csv格式
	_, ok := FileMap[suffixName]
	if !ok {
		return "", fmt.Errorf("文件类型不正确")
	}

	// 判断大小
	if file.Size > maxSize {
		return "", fmt.Errorf("超出文件最大限制 100M")
	}

	if err = CreateFile("./file"); err != nil {
		return "", fmt.Errorf("上传失败")
	}

	//保存路径拼接当前目录下
	filePath = fmt.Sprintf("./file/%s", fileName)

	//上传文件到指定的目录
	if err = c.SaveUploadedFile(file, filePath); err != nil {
		return "", fmt.Errorf("上传失败")
	}
	return filePath, nil
}

// CreateFile 创建文件
func CreateFile(filePath string) error {
	if !IsExist(filePath) {
		err := os.Mkdir(filePath, os.ModePerm)
		if err != nil {
			fmt.Println("create upload filepath error filePath:", filePath)
			return err
		}
		return err
	}
	return nil
}

// IsExist 判断所给路径文件/文件夹是否存在(返回true是存在)
func IsExist(path string) bool {
	_, err := os.Stat(path) //os.Stat获取文件信息
	if err != nil {
		if os.IsExist(err) {
			return true
		}
		return false
	}
	return true
}
